package com.xb;


import com.xb.statement.User;
import com.xb.util.dbUtil;
import org.junit.Test;

import java.util.Scanner;

/**
 * PreparedStatement去解决SQL注入的问题
 * PreparedStatement的优点：
 * 1.因为他是占位符? 支持传输blob的类型 而Statement是不支持blob的
 * 2.因为PreparedStatement的SQL都会预编译的，所以他会批量插入的时候就
 * 只会填入占位符。而不不像Statement一样每次都要编译一下SQL语句再去编译
 */
public class PreparedStatementTest02 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入用户名：");
        String user = scanner.nextLine();
        System.out.print("请输入密码：");
        String password = scanner.nextLine();
        //SELECT user,password FROM user_table WHERE user = '1' or ' AND password = '=1 or '1' = '1'
        //请输入用户名：1' or
        //请输入密码：=1 or '1' = '1
        //Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'.
        // The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
        //登录成功
        String sql = "SELECT user,password FROM user_table WHERE user = ? AND password = ?";
        /*
         * 为什么PreparedStatement能去解决SQL注入的问题？
         * 因为他在创建对象的时候会进行预编译，预编译的话就会确定了SQL的语义 本身是and语句
         * 就不会改成or的语义。这样就可以解决SQL注入问题
         */
        User returnUser = dbUtil.selectGetData02(sql,User.class,user,password);
        if(returnUser != null){
            System.out.println("登录成功");
        }else{
            System.out.println("用户名不存在或密码错误");
        }
    }
}
